/**
 * @file axios封装实例
 * @author mano233
 * @date 2019-03-25
 */
import axios from 'axios';
import config from '@/config/httpConfig.js';// 导入默认配置
import store from '../store';
import {message} from 'ant-design-vue';
// import qs from 'qs';// 序列化请求数据

// axios实例
const instance = axios.create(
    {
        baseURL: config.baseURL,
    }
);
// 状态码
const Status = {
    SUCCESS: 'SUCCESS',
    ERROR: 'ERROR',
    INFO: 'INFO',
    WARN: 'WARN',
};
// request 拦截器
instance.interceptors.request.use(
    (config) => {
        // Tip: 1
        // 请求开始的时候可以结合 vuex 开启全屏的 loading 动画
        store.state.loading = true;
        // Tip: 2
        // 带上token
        const token = store.getters.getToken;
        config.headers[ 'Authorization' ] = token?token:'';

        // Tip: 3
        // 根据请求方法，序列化传来的参数，根据后端需求是否序列化
        if (config.method.toLocaleLowerCase() === 'post'
            || config.method.toLocaleLowerCase() === 'put'
            || config.method.toLocaleLowerCase() === 'delete') {
            // config.data = qs.stringify(config.data);
        }
        return config;
    },
    (error) => {
        // 请求错误时做些事(接口错误、超时等)
        // Tip: 4
        // 关闭loading
        store.state.loading = false;
        console.log('request:', error);

        //  1.判断请求超时
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
            console.log('请求超时');
            // return service.request(originalRequest);//例如再重复请求一次
        }
        //  2.需要重定向到错误页面
        const errorInfo = error.response;
        console.log(errorInfo);
        if (errorInfo) {
            // error =errorInfo.data
            // 页面那边catch的时候就能拿到详细的错误信息
            // 看最下边的Promise.reject
            // const errorStatus = errorInfo.status; // 404 403 500 ... 等
            // router.push({
            //     path: `/error/${errorStatus}`,
            // });
        }
        return Promise.reject(error); // 在调用的那边可以拿到(catch)你想返回的错误信息
    }
);

// response 拦截器
instance.interceptors.response.use(
    (response) => {
        store.state.loading = false;
        let data;
        // IE9时response.data是undefined
        // 因此需要使用response.request.responseText(Stringify后的字符串)
        if (response.data === undefined) {
            data = response.request.responseText;
        } else {
            data = response.data;
        }
        // 根据返回的code值来做不同的处理
        switch (data.status) {
            case Status.SUCCESS:
                return data.data;
            case Status.INFO:
                message.info(data.msg).then();
                return data.data;
            case Status.WARN:
                message.warn(data.msg).then();
                return data.data;
            case Status.ERROR:
                message.error(data.msg).then();
                throw new Error(data.data);
            default:
                throw new Error(data.data);
        }
    },
    (err) => {
        store.state.loading = false;
        if (err && err.response) {
            switch (err.response.status) {
                case 400:
                    err.message = '请求错误';
                    break;
                case 401:
                    err.message = '未授权，请登录';
                    break;
                case 403:
                    err.message = '拒绝访问';
                    break;
                case 404:
                    err.message = `请求地址出错: ${err.response.config.url}`;
                    break;
                case 408:
                    err.message = '请求超时';
                    break;
                case 500:
                    err.message = '服务器内部错误';
                    break;
                case 501:
                    err.message = '服务未实现';
                    break;
                case 502:
                    err.message = '网关错误';
                    break;
                case 503:
                    err.message = '服务不可用';
                    break;
                case 504:
                    err.message = '网关超时';
                    break;
                case 505:
                    err.message = 'HTTP版本不受支持';
                    break;
                default:
            }
        }
        // Message.error(`ERROR: ${err}`);
        // 返回接口返回的错误信息
        err.message = '网络错误';
        message.error(err.message).then();
        return Promise.reject();
    }
);
const CancelTokenFn = axios.CancelToken;
/**
 * 暴露的实例方法
 */
export {instance, CancelTokenFn};
